#include "StackTest.hpp"
#include "stack.hpp"

/*
 * Implementierung des Tests. In diesem Zusammenhang werden
 * die Makros CPPUNIT_ASSERT(bool) eingesetzt. Diese Makros
 * erwarten einen Ausdruck der true zurück gibt, wenn der Test
 * erfolgreich war.
 */
void StackTest::runTest()
{
	using namespace stack;

	//-- Vorbereiten der, für die Tests benötigten, structs
	Stack        stack      = {0,             0 };
	StackElement newElement = {"TestElement", 0 };

	//-- Testen der Funktion push()
	push(stack, newElement);
	CPPUNIT_ASSERT( stack.size == 1);
	CPPUNIT_ASSERT( stack.top  == &newElement);

	//-- Testen der Funktio pop()
	StackElement oldElement = pop(stack);
	CPPUNIT_ASSERT( stack.size         == 0);
	CPPUNIT_ASSERT( stack.top          == 0);
	CPPUNIT_ASSERT( oldElement.content == newElement.content);
}

/*
 * Startet den Test mit der Verwendung eines TestRunner.
 * Ein TestRunner ist notwendig um ein Reporting über
 * den Testlauf zu erstellen.
 */
bool StackTest::start()
{
	CppUnit::TextUi::TestRunner runner;
	runner.addTest(this);

	return runner.run();
}

/*
 * Main zur Ausführung des Tests
 */
int main()
{
    StackTest test;
    return test.start();
}
